/*
 *  Copyright (C) 2010 Fabien Renaud
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.boc.botv.model;
// Generated Jun 11, 2010 10:44:35 PM by Hibernate Tools 3.2.1.GA

import com.boc.botv.common.UserStatus;
import com.boc.botv.common.UserTitle;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;

/**
 * Représente un utilisateur connecté du site
 * @author Fabien Renaud
 */
@Entity
@Table(name = "User", catalog = "botv", uniqueConstraints = {
  @UniqueConstraint(columnNames = "login")})
public class User implements java.io.Serializable {

  private static final SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy");
  private static final SimpleDateFormat dateLongFormatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
  /**
   * Id de l'utilisateur
   */
  private Integer id;
  private String login;
  private String password;
  private String email;
  private int title;
  private String firstName;
  private String lastName;
  private String address0;
  private String address1;
  private String address2;
  private String zipCode;
  private String city;
  private String country;
  private String phoneHome;
  private String phoneGsm;
  private Date birthDate;
  private double balance;
  private String ip;
  private int status;
  private Date creationTime;
  private Date lastModification;
  private Date lastConnection;
  private boolean acceptNewsletterSite;
  private boolean acceptNewsletterPartners;
  private Set<BetInstance> betInstances = new HashSet<BetInstance>(0);
  private Set<Transaction> transactions = new HashSet<Transaction>(0);
  private Set<PaymentMethod> paymentMethods = new HashSet<PaymentMethod>(0);
  private Set<Bet> bets = new HashSet<Bet>(0);
  // Transient
  private String checkPassword;
  private boolean termsAccepted;
  private String newPassword;
  private String checkNewPassword;

  /**
   * Crée un utilisateur par défaut
   */
  public User() {
  }

  /**
   * Crée un utilisateur
   * @param login Pseudo de l'utilisateur
   * @param password Mot de passe crypté de l'utilisateur
   * @param email Courriel de l'utilisateur
   * @param title Civilité de l'utilisateur
   * @param firstName Prénom
   * @param lastName Nom
   * @param address0 Promière ligne de son adresse
   * @param address1 Deuxième ligne de son adresse
   * @param address2 Troisiène ligne de son adresse
   * @param zipCode Code postal
   * @param city Ville
   * @param country Pays
   * @param phoneHome Téléphone fixe
   * @param phoneGsm Téléphone mobile
   * @param birthDate Date de naissance
   * @param balance Solde du compte utilisateur
   * @param ip Adresse IP lors de l'inscription
   * @param status Statut de l'utilisateur
   * @param creationTime Date de création du compte
   * @param lastModification Dernière modification des informations du compte par l'utilisateur
   * @param lastConnection Dernière date de connection de l'utilisateur
   * @param acceptNewsletterSite true si accepte de recevoir les newletters du site
   * @param acceptNewsletterPartners true si accepte de recevoir les newletters des partenaires du site
   */
  public User(String login, String password, String email, int title, String firstName, String lastName, String address0, String address1, String address2, String zipCode, String city, String country, String phoneHome, String phoneGsm, Date birthDate, double balance, String ip, int status, Date creationTime, Date lastModification, Date lastConnection, boolean acceptNewsletterSite, boolean acceptNewsletterPartners) {
    this.login = login;
    this.password = password;
    this.email = email;
    this.title = title;
    this.firstName = firstName;
    this.lastName = lastName;
    this.address0 = address0;
    this.address1 = address1;
    this.address2 = address2;
    this.zipCode = zipCode;
    this.city = city;
    this.country = country;
    this.birthDate = birthDate;
    this.balance = balance;
    this.status = status;
    this.creationTime = creationTime;
    this.lastModification = lastModification;
    this.lastConnection = lastConnection;
    this.acceptNewsletterSite = acceptNewsletterSite;
    this.acceptNewsletterPartners = acceptNewsletterPartners;
    this.ip = checkIp(ip) ? ip : "0.0.0.0";
    this.phoneHome = checkPhone(phoneHome) ? phoneHome : "";
    this.phoneGsm = checkPhone(phoneGsm) ? phoneGsm : "";
  }

  /**
   * Crée un utilisateur
   * @param login Pseudo de l'utilisateur
   * @param password Mot de passe crypté de l'utilisateur
   * @param email Courriel de l'utilisateur
   * @param title Civilité de l'utilisateur
   * @param firstName Prénom
   * @param lastName Nom
   * @param address0 Promière ligne de son adresse
   * @param address1 Deuxième ligne de son adresse
   * @param address2 Troisiène ligne de son adresse
   * @param zipCode Code postal
   * @param city Ville
   * @param country Pays
   * @param phoneHome Téléphone fixe
   * @param phoneGsm Téléphone mobile
   * @param birthDate Date de naissance
   * @param balance Solde du compte utilisateur
   * @param ip Adresse IP lors de l'inscription
   * @param status Statut de l'utilisateur
   * @param creationTime Date de création du compte
   * @param lastModification Dernière modification des informations du compte par l'utilisateur
   * @param lastConnection Dernière date de connection de l'utilisateur
   * @param acceptNewsletterSite true si accepte de recevoir les newletters du site
   * @param acceptNewsletterPartners true si accepte de recevoir les newletters des partenaires du site
   * @param betInstances Paris auxquels à joué l'utilisateur
   * @param transactions Transactions liées au compte utilisateur
   * @param bets Paris joués
   * @param bankTransactions Transactions bancaires
   */
  public User(String login, String password, String email, int title, String firstName, String lastName, String address0, String address1, String address2, String zipCode, String city, String country, String phoneHome, String phoneGsm, Date birthDate, double balance, String ip, int status, Date creationTime, Date lastModification, Date lastConnection, boolean acceptNewsletterSite, boolean acceptNewsletterPartners, Set<BetInstance> betInstances, Set<Transaction> transactions, Set<PaymentMethod> paymentMethods, Set<Bet> bets) {
    this.login = login;
    this.password = password;
    this.email = email;
    this.title = title;
    this.firstName = firstName;
    this.lastName = lastName;
    this.address0 = address0;
    this.address1 = address1;
    this.address2 = address2;
    this.zipCode = zipCode;
    this.city = city;
    this.country = country;
    this.birthDate = birthDate;
    this.balance = balance;
    this.status = status;
    this.creationTime = creationTime;
    this.lastModification = lastModification;
    this.lastConnection = lastConnection;
    this.acceptNewsletterSite = acceptNewsletterSite;
    this.acceptNewsletterPartners = acceptNewsletterPartners;
    this.betInstances = betInstances;
    this.transactions = transactions;
    this.paymentMethods = paymentMethods;
    this.bets = bets;
    this.ip = checkIp(ip) ? ip : "0.0.0.0";
    this.phoneHome = checkPhone(phoneHome) ? phoneHome : "";
    this.phoneGsm = checkPhone(phoneGsm) ? phoneGsm : "";
  }

  /**
   * Obtient l'id de l'utilisateur
   * @return L'id de l'utilisateur
   */
  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "id", unique = true, nullable = false)
  public Integer getId() {
    return this.id;
  }

  /**
   * Modifie l'id de l'utilisateur
   * @param id Nouvel id
   */
  public void setId(Integer id) {
    this.id = id;
  }

  /**
   * Obtient le pseudo de l'utilisateur
   * @return Le pseudo de l'utilisateur
   */
  @Column(name = "login", unique = true, nullable = false, length = 32)
  public String getLogin() {
    return login;
  }

  /**
   * Modifie le pseudo de l'utilisateur
   * @param login Nouveau pseudo
   */
  public void setLogin(String login) {
    this.login = login;
  }

  /**
   * Obtient le mot de passe crypté de l'utilisateur
   * @return Le mot de passe crypté
   */
  @Column(name = "password", nullable = false, length = 64)
  public String getPassword() {
    return password;
  }

  /**
   * Modifie le mot de passe de l'utilisateur
   * @param password Nouveau mot de passe crypté
   */
  public void setPassword(String password) {
    this.password = password;
  }

  /**
   * Obtient le courriel de l'utilisateur
   * @return Le courriel de l'utilisateur
   */
  @Column(name = "email", nullable = false, length = 64)
  public String getEmail() {
    return this.email;
  }

  /**
   * Modifie le courriel de l'utilisateur
   * @param email Nouveau courriel de l'utilisateur
   */
  public void setEmail(String email) {
    this.email = email;
  }

  /**
   * Obtient la civilité de l'utilisateur
   * @return La civilité de l'utilisateur
   */
  @Column(name = "title", nullable = false)
  public int getTitle() {
    return this.title;
  }

  /**
   * Modifie la civilité de l'utilisateur
   * @param title Nouvelle civilté de l'utilisateur
   */
  public void setTitle(int title) {
    if (title == UserTitle.monsieur
            || title == UserTitle.madame
            || title == UserTitle.mademoiselle) {
      this.title = title;
    }
  }

  /**
   * Obtient le prénom de l'utilisateur
   * @return Le prénom de l'utilisateur
   */
  @Column(name = "firstName", nullable = false, length = 32)
  public String getFirstName() {
    return this.firstName;
  }

  /**
   * Modifie le prénom de l'utilisateur
   * @param firstName Nouveau prénom de l'utilisateur
   */
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  /**
   * Obtient le nom de l'utilisateur
   * @return Le nom de l'utilisateur
   */
  @Column(name = "lastName", nullable = false, length = 32)
  public String getLastName() {
    return this.lastName;
  }

  /**
   * Modifie le nom de l'utilisateur
   * @param lastName Nouveau nom de l'utilisateur
   */
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  /**
   * Obtient la première ligne de l'adresse de l'utilisateur
   * @return La première ligne de l'adresse de l'utilisateur
   */
  @Column(name = "address0", nullable = false, length = 48)
  public String getAddress0() {
    return this.address0;
  }

  /**
   * Modifie la première ligne de l'adresse de l'utilisateur
   * @param address0 Nouvelle première ligne de l'adresse de l'utilisateur
   */
  public void setAddress0(String address0) {
    this.address0 = address0;
  }

  /**
   * Obtient la deuxième ligne de l'adresse de l'utilisateur
   * @return La deuxième ligne de l'adresse de l'utilisateur
   */
  @Column(name = "address1", nullable = false, length = 48)
  public String getAddress1() {
    return this.address1;
  }

  /**
   * Modifie la deuxième ligne de l'adresse de l'utilisateur
   * @param address1 Nouvelle deuxième ligne de l'adresse de l'utilisateur
   */
  public void setAddress1(String address1) {
    this.address1 = address1;
  }

  /**
   * Obtient la troisième ligne de l'adresse de l'utilisateur
   * @return La troisième ligne de l'adresse de l'utilisateur
   */
  @Column(name = "address2", nullable = false, length = 48)
  public String getAddress2() {
    return this.address2;
  }

  /**
   * Modifie la troisième ligne de l'adresse de l'utilisateur
   * @param address2 Nouvelle troisième ligne de l'adresse de l'utilisateur
   */
  public void setAddress2(String address2) {
    this.address2 = address2;
  }

  /**
   * Obtient le code postal de l'utilisateur
   * @return Le code postal de l'utilisateur
   */
  @Column(name = "zipCode", nullable = false, length = 5)
  public String getZipCode() {
    return this.zipCode;
  }

  /**
   * Modifie le code postal de l'utilisateur
   * @param zipCode Nouveau code postal de l'utilisateur
   */
  public void setZipCode(String zipCode) {
    this.zipCode = zipCode;
  }

  /**
   * Obtient la ville de l'utilisateur
   * @return La ville de l'utilisateur
   */
  @Column(name = "city", nullable = false, length = 64)
  public String getCity() {
    return this.city;
  }

  /**
   * Modifie la ville de l'utilisateur
   * @param city Nouvelle ville de l'utilisateur
   */
  public void setCity(String city) {
    this.city = city;
  }

  /**
   * Obtient le pays de l'utilisateur
   * @return Le pays de l'utilisateur
   */
  @Column(name = "country", nullable = false, length = 32)
  public String getCountry() {
    return this.country;
  }

  /**
   * Modifie le pays de l'utilisateur
   * @param country Nouveau pays de l'utilisateur
   */
  public void setCountry(String country) {
    this.country = country;
  }

  /**
   * Obtient le téléphone fixe de l'utiliasteur
   * @return Le téléphone fixe de l'utilisateur
   */
  @Column(name = "phoneHome", nullable = false, length = 12)
  public String getPhoneHome() {
    return this.phoneHome;
  }

  /**
   * Modifie le téléphone fixe de l'utiliasteur
   * @param phoneHome Nouveau télépho fixe de l'utilisateur. Doit être au format 017654321 ou +3347654321
   */
  public void setPhoneHome(String phoneHome) {
    this.phoneHome = checkPhone(phoneHome) ? phoneHome : "";
  }

  /**
   * Obtient le téléphone mobile de l'utiliasteur
   * @return Le téléphone mobile de l'utilisateur
   */
  @Column(name = "phoneGsm", nullable = false, length = 12)
  public String getPhoneGsm() {
    return this.phoneGsm;
  }

  /**
   * Modifie le téléphone mobile de l'utiliasteur
   * @param phoneGsm Nouveau téléphone mobile de l'utilisateur. Doit être au format 067654321 ou +3367654321
   */
  public void setPhoneGsm(String phoneGsm) {
    this.phoneGsm = checkPhone(phoneGsm) ? phoneGsm : "";
  }

  /**
   * Obtient la date de naissance de l'utilisateur
   * @return La date de naissance de l'utilisateur
   */
  @Temporal(TemporalType.DATE)
  @Column(name = "birthDate", nullable = false, length = 10)
  public Date getBirthDate() {
    return this.birthDate;
  }

  /**
   * Modifie la date de naissance de l'utiliasteur
   * @param birthDate Nouvelle date de naissance de l'utilisateur
   */
  public void setBirthDate(Date birthDate) {
    this.birthDate = birthDate;
  }

  /**
   * Obtient le solde du compte de l'utilisateur
   * @return Le solde du compte de l'utilisateur
   */
  @Column(name = "balance", nullable = false, precision = 22, scale = 0)
  public double getBalance() {
    return this.balance > 0 ? this.balance : 0;
  }

  /**
   * Modifie le solde du compte de l'utilisateur
   * @param balance Nouveau solde. Doit être positif.
   */
  public void setBalance(double balance) {
    this.balance = balance > 0 ? balance : 0;
  }

  /**
   * Obtient l'adresse IP avec laquelle l'utilisateur s'est inscrit
   * @return L'adresse IP avec laquelle l'utilisateur s'est inscrit
   */
  @Column(name = "ip", nullable = false, length = 15)
  public String getIp() {
    return this.ip != null ? ip : "0.0.0.0";
  }

  /**
   * Modifie l'adresse IP avec laquelle l'utilisateur s'est inscrit
   * @param ip Nouvelle adresse IP. Doit être au format 221.78.97.234
   */
  public void setIp(String ip) {
    this.ip = checkIp(ip) ? ip : "";
  }

  /**
   * Obtient le statut du compte utiliasteur
   * @return Le statut du compte utiliasteur
   */
  @Column(name = "status", nullable = false)
  public int getStatus() {
    return this.status;
  }

  /**
   * Modifie le statut du compte utiliasteur
   * @param status Nouveau statut
   */
  public void setStatus(int status) {
    if (status == UserStatus.disabled
            || status == UserStatus.enabled
            || status == UserStatus.banned) {
      this.status = status;
    }
  }

  /**
   * Obtient la date de création du compte utilisateur
   * @return La date de création du compte utilisateur
   */
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "creationTime", nullable = false, length = 19)
  public Date getCreationTime() {
    return creationTime;
  }

  /**
   * Modifie la date de création du compte utilisateur
   * @param creationTime Nouvelle date
   */
  public void setCreationTime(Date creationTime) {
    this.creationTime = creationTime;
  }

  /**
   * Obtient la date de dernière modification des informations du compte utilisateur par l'utilisateur
   * @return La date de dernière modification des informations du compte utilisateur par l'utilisateur
   */
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "lastModification", nullable = false, length = 19)
  public Date getLastModification() {
    return lastModification;
  }

  /**
   * Modifie la date de dernière modification des informations du compte utilisateur par l'utilisateur
   * @param lastModification Dernière date de modification
   */
  public void setLastModification(Date lastModification) {
    this.lastModification = lastModification;
  }

  /**
   * Obtient la date de dernière connection de l'utilisateur
   * @return La date de dernière connection de l'utilisateur
   */
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "lastConnection", nullable = false, length = 19)
  public Date getLastConnection() {
    return lastConnection;
  }

  /**
   * Modifie la date de dernière connection de l'utilisateur
   * @param lastConnection Date de dernière connection
   */
  public void setLastConnection(Date lastConnection) {
    this.lastConnection = lastConnection;
  }

  /**
   * Obtient si l'utilisateur accepte de recevoir la newsletter du site ou non
   * @return true si l'utilistaeur accepte de recevoir la newsletter du site
   */
  @Column(name = "acceptNewsletterSite", nullable = false)
  public boolean isAcceptNewsletterSite() {
    return this.acceptNewsletterSite;
  }

  /**
   * Modifie le fait que l'utilisateur veuille recevoir la newsletter du site ou non
   * @param acceptNewsletterSite true si l'utilisateur veut désormais recevoir la newsletter du site
   */
  public void setAcceptNewsletterSite(boolean acceptNewsletterSite) {
    this.acceptNewsletterSite = acceptNewsletterSite;
  }

  /**
   * Obtient si l'utilisateur accepte de recevoir la newsletter des partenaires du site ou non
   * @return true si l'utilistaeur accepte de recevoir la newsletter des partenaires du site
   */
  @Column(name = "acceptNewsletterPartners", nullable = false)
  public boolean isAcceptNewsletterPartners() {
    return this.acceptNewsletterPartners;
  }

  /**
   * Modifie le fait que l'utilisateur veuille recevoir la newsletter des partenaires du site ou non
   * @param acceptNewsletterPartners true si l'utilisateur veut désormais recevoir la newsletter des partenaires du site
   */
  public void setAcceptNewsletterPartners(boolean acceptNewsletterPartners) {
    this.acceptNewsletterPartners = acceptNewsletterPartners;
  }

  /**
   * Obtient tous les jeux que l'utilisateur a effectué
   * @return Les jeux que l'utilisateur a effectué
   */
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")
  public Set<BetInstance> getBetInstances() {
    return this.betInstances;
  }

  /**
   * Modifie les jeux que l'utilisateur a effectué
   * @param betInstances Les nouveaux jeux que l'utilisateur a effectué
   */
  public void setBetInstances(Set<BetInstance> betInstances) {
    this.betInstances = betInstances;
  }

  /**
   * Obtient toutes les transactions site concernant cet utilisateur
   * @return Les transactions site concernant cet utilisateur
   */
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")
  public Set<Transaction> getTransactions() {
    return this.transactions;
  }

  /**
   * Modifie les transactions site concernant cet utilisateur
   * @param transactions Nouvelles transactions site concernant cet utilisateur
   */
  public void setTransactions(Set<Transaction> transactions) {
    this.transactions = transactions;
  }

  /**
   * Obtient tous les paris auxquels cet utilisateur a joué
   * @return Les paris auxquels cet utilisateur a joué
   */
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")
  public Set<Bet> getBets() {
    return this.bets;
  }

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")
  public Set<PaymentMethod> getPaymentMethods() {
    return this.paymentMethods;
  }

  public void setPaymentMethods(Set<PaymentMethod> paymentMethods) {
    this.paymentMethods = paymentMethods;
  }

  /**
   * Modifie les paris auxquels cet utilisateur a joué
   * @param bets Nouveau paris auxquels cet utilisateur a joué
   */
  public void setBets(Set<Bet> bets) {
    this.bets = bets;
  }

  /**
   * Ajoute un montant au solde du compte
   * @param amount Montant à ajouter au solde du compte
   */
  public void increaseBalance(double amount) {
    this.balance += amount;
  }

  /**
   * Retire un montant au solde du compte
   * @param amount Montant à retirer au solde du compte
   */
  public void decreaseBalance(double amount) {
    this.balance -= amount;
  }

  public void setBirthDateFormatted(String s) {
  }

  public void setCreationTimeFormatted(String s) {
  }

  public void setLastConnectionFormatted(String s) {
  }

  public void setLastModificationFormatted(String s) {
  }

  @Transient
  public String getBirthDateFormatted() {
    return dateFormatter.format(birthDate);
  }

  @Transient
  public String getCreationTimeFormatted() {
    return dateLongFormatter.format(creationTime);
  }

  @Transient
  public String getLastConnectionFormatted() {
    return dateLongFormatter.format(lastConnection);
  }

  @Transient
  public String getLastModificationFormatted() {
    return dateLongFormatter.format(lastModification);
  }

  @Transient
  public PaymentMethod getPaymentMethod() {
    if (paymentMethods.size() != 1) {
      return null;
    }
    return (PaymentMethod) paymentMethods.toArray()[0];
  }

  /**
   * Obtient la confirmation du mot de passe
   * @return La confirmation du mot de passe
   */
  @Transient
  public String getCheckPassword() {
    return checkPassword;
  }

  /**
   * Modifie la confirmation du mot de passe
   * @param checkPassword Nouvelle confirmation du mot de passe
   */
  public void setCheckPassword(String checkPassword) {
    this.checkPassword = checkPassword;
  }

  /**
   * Permet de savoir si l'utilisateur a accepté les CGU.
   * @return true si l'utilisateur a accepté les CGU, false sinon.
   */
  @Transient
  public boolean isTermsAccepted() {
    return termsAccepted;
  }

  /**
   * Modifie l'état d'acceptation des CGU.
   * @param termsAccepted true si l'utilisateur accepte les CGU, false sinon.
   */
  public void setTermsAccepted(boolean termsAccepted) {
    this.termsAccepted = termsAccepted;
  }

  /**
   * Obtient le nouveau mot de passe
   * @return La confirmation du mot de passe
   */
  @Transient
  public String getNewPassword() {
    return newPassword;
  }

  /**
   * Modifie le nouveau mot de passe
   * @param password Nouveau mot de passe
   */
  public void setNewPassword(String password) {
    this.newPassword = password;
  }

  /**
   * Obtient la confirmation du nouveau mot de passe
   * @return La confirmation du mot de passe
   */
  @Transient
  public String getCheckNewPassword() {
    return checkNewPassword;
  }

  /**
   * Modifie la confirmation du nouveau mot de passe
   * @param checkPassword Nouvelle confirmation du mot de passe
   */
  public void setCheckNewPassword(String checkPassword) {
    this.checkNewPassword = checkPassword;
  }

  private boolean checkPhone(String phone) {
    if (phone == null) {
      return false;
    }
    String ph = phone;
    if (ph.length() == 12) {
      if (ph.charAt(0) != '+') {
        return false;
      }
    } else if (ph.length() == 10) {
      if (ph.charAt(0) != '0') {
        return false;
      }
    } else {
      return false;
    }
    ph = ph.substring(1);
    try {
      Long.parseLong(ph);
    } catch (NumberFormatException e) {
      return false;
    }
    return true;
  }

  private boolean checkIp(String ip) {
    if (ip == null) {
      return false;
    }
    String[] array = ip.split("\\.");
    if (array.length != 4) {
      return false;
    }
    try {
      for (int i = 0; i < 4; i++) {
        int n = Integer.parseInt(array[i]);
        if (n < 0 || n > 255) {
          return false;
        }
      }
    } catch (NumberFormatException e) {
      return false;
    }
    return true;
  }
}
